Cost and Usage Report(CUR)のマニフェストファイルを使用してAmazon Athenaのテーブルを作成する
実行環境が古くなっていたため、ツール等アップデートしました。またAWS CloudShellでの実行を確認しました。Date: 2024-10-21
こんにちは。サービスグループの武田です。
AWSでは、AWSサービスの利用明細などが記載されたCost and Usage Report(CUR)というレポートを取得できます。個人で利用している方、あるいはAWS Organizationsの一括請求機能を利用している方は、レポート出力の設定をすれば取得できます。
AWS のコストと使用状況レポートを作成する - AWS 請求情報とコスト管理
クラスメソッドが提供しているAWS総合支援サービスであるメンバーズでは、加入いただくことでAWS利用費が割り引きされます。しかし、このCURが利用できないということで、一部のお客様からレポート提供の要望をいただいていました。先日、CUR提供のサービスを開始しまして、簡単な設定をするだけでレポートを取得できます(詳細はお知らせなどをご覧ください)。
ここからが本題ですが、CURは列が可変のため、列情報などがマニフェストファイルとして提供されています。またレポートは 上書きではなく追加 をするため、どれが最新のレポートなのかも、マニフェストファイルを確認する必要があります。そして、CUR自体はただのCSVファイルのため(そして容量も大きいため)、やはりAthenaなどでクエリをたたきたいというのが本心です。しかし自分でマニフェストファイルを見てAthena用のDDLを作るなんてことは正直やりたくありません。
実は以前に平田が次のエントリを書いていました。
なるほど、これは便利だなということで、これを元ネタに改造したスクリプトを作ってみましたので公開します。
TAKEDA-Takashi/athena-create-table-cur: S3に保存されているCURマニフェストファイルからAthenaテーブル作成用のDDLを出力する。
環境
ざっとREADMEには書いたのですが、実行にはPython 3が必要です。またリポジトリをクローンするためGitも必要です。
$ python3 -V Python 3.12.2 $ git --version git version 2.44.0
次の手順で環境を構築してください(すでにuvがインストール済みであれば、3行目は不要です)。
$ git clone git@github.com:TAKEDA-Takashi/athena-create-table-cur.git $ cd athena-create-table-cur $ pip3 install uv $ uv sync
使い方
10月分のレポートを例に簡単な使い方を説明します。S3のcm-cur-123456789012/CUR/Hourly/cur_hourly/20191001-20191101
に、次のようにCURが出力されているとします。
このcur_hourly-Manifest.json
を確認することで、最新のCURが格納されているassemblyIdが分かります。スクリプトでは、単にAthena用のDDLを出力するだけのprintモードと、実際にテーブルを作成するathenaモードがあります。動作確認するだけであればprintモードを使用してください。
$ uv run main.py -m s3://cm-cur-123456789012/CUR/Hourly/cur_hourly/20191001-20191101/cur_hourly-Manifest.json
次にathenaモードですが、Athenaのクエリをたたく際には結果格納用のバケットを指定する必要があります。そのため、事前に適当なバケットを作成しておいてください。ここではaws-athena-query-results-123456789012-ap-northeast-1
というバケットがあるものとします。
$ uv run main.py -m s3://cm-cur-123456789012/CUR/Hourly/cur_hourly/20191001-20191101/cur_hourly-Manifest.json athena -o s3://aws-athena-query-results-123456789012-ap-northeast-1
また-f
と-v
オプションも用意してみました。-f
はすでにその月のテーブルが作成済みであった場合、先に削除してから再作成します。-v
はマニフェストファイルのデータがゴミとしてAthenaクエリの結果に入ってきてしまうため、それを除外したビューを作成します。
まとめ
CURは非常に大量のレコードを含んでいるため、人間が目で確認することには向いていません。一方で、一度Athenaなどでクエリできるようにしておけば、好きなように集計できるためとても便利です。よければ使ってみてください。